/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ssp.database;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ssp.utility.Pair;

/**
 * サービスマップを表すクラス
 * @author yamazaki
 */
public class ServiceMap implements Database {
    
    /**
     * 最後にデータベースを更新した時刻
     */
    private double lastUpdateTime;
    
    /**
     * サービスの処理負荷を保持するマップ<br>
     * Pair&lt;FrontendServer.ID, ServiceEntry.typeID&gt;がkey値
     */
    private Map<Pair<Integer, Integer>, Double> workloadTable;
    
    /**
     * サービス利用料金を保持するマップ<br>
     * Pair&lt;FrontendServer.ID, ServiceEntry.typeID&gt;がkey値
     */
    private Map<Pair<Integer, Integer>, Double> chargeTable;
    
    /**
     * QoS指標のリストを保持するマップ<br>
     * Pair&lt;FrontendServer.ID, ServiceEntry.typeID&gt;がkey値
     */
    private Map<Pair<Integer, Integer>, List<Integer>> QoSindexListTable;
    
    /**
     * フロントエンドサーバの許容量を保持するマップ
     */
    private Map<Integer, Double> availabilityTable;
    
    /**
     * コンストラクタ
     */
    public ServiceMap() {
        init();
    }

    @Override
    public final void init() {
        this.lastUpdateTime = 0.0;
        this.workloadTable = new HashMap<Pair<Integer, Integer>, Double>();
        this.chargeTable = new HashMap<Pair<Integer, Integer>, Double>();
        this.QoSindexListTable = new HashMap<Pair<Integer, Integer>, List<Integer>>();
        this.availabilityTable = new HashMap<Integer, Double>();
    }
    
    /**
     * @return the lastUpdateTime
     */
    public double getLastUpdateTime() {
        return this.lastUpdateTime;
    }
    
    /**
     * @param key
     * @return the workload
     */
    public double getWorkload(Pair<Integer, Integer> key) {
        return this.workloadTable.get(key);
    }
    
    /**
     * @param key
     * @return the charge
     */
    public double getCharge(Pair<Integer, Integer> key) {
        return this.chargeTable.get(key);
    }
    
    /**
     * @param key
     * @param index
     * @return the QoS index
     */
    public int getQosIndex(Pair<Integer, Integer> key, int index) {
        return this.QoSindexListTable.get(key).get(index);
    }
    
    /**
     * @param key
     * @return the availability
     */
    public double getAvailability(int key) {
        return this.availabilityTable.get(key);
    }

    /**
     * @return the QoSindexListTable
     */
    public Map<Pair<Integer, Integer>, List<Integer>> getQoSindexListTable() {
        return QoSindexListTable;
    }

    /**
     * @return the availabilityTable
     */
    public Map<Integer, Double> getAvailabilityTable() {
        return availabilityTable;
    }

    /**
     * @return the chargeTable
     */
    public Map<Pair<Integer, Integer>, Double> getChargeTable() {
        return chargeTable;
    }

    /**
     * @return the workloadTable
     */
    public Map<Pair<Integer, Integer>, Double> getWorkloadTable() {
        return workloadTable;
    }
    
    /**
     * workloadTableを更新する
     * @param currentTime 更新時刻
     * @param key
     * @param val 更新値
     */
    public void updateWorkloadTable(double currentTime, Pair<Integer, Integer> key, Double val) {
        this.lastUpdateTime = currentTime;
        this.workloadTable.put(key, val);
    }
    
    /**
     * chargeTableを更新する
     * @param currentTime 更新時刻
     * @param key
     * @param val 更新値
     */
    public void updateChargeTable(double currentTime, Pair<Integer, Integer> key, Double val) {
        this.lastUpdateTime = currentTime;
        this.chargeTable.put(key, val);
    }
    
    /**
     * QoSindexTableを更新する
     * @param currentTime 更新時刻
     * @param key
     * @param val 更新値
     */
    public void updateQoSimdexListTable(double currentTime, Pair<Integer, Integer> key, List<Integer> val) {
        this.lastUpdateTime = currentTime;
        this.QoSindexListTable.put(key, new ArrayList<Integer>(val));
    }
    
    /**
     * availabilityTableを更新する
     * @param currentTime 更新時刻
     * @param key
     * @param val 更新値
     */
    public void updateAvailabilityTable(double currentTime, int key, double val) {
        this.lastUpdateTime = currentTime;
        this.availabilityTable.put(key, val);
    }
    
}
